﻿using Model;
using Model.Auxiliar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BLL
{
    public class Pesquisa_BLL
    {
        #region singleton
        private static Pesquisa_BLL instance;

        private Pesquisa_BLL() { }

        public static Pesquisa_BLL Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Pesquisa_BLL();
                }
                return instance;
            }
        }
        #endregion

        public List<ResultadoPesquisa> ObterListaResultados(string text, int id_empresa, string leftPartUrl, int utilizadorId)
        {
            if (string.IsNullOrEmpty(text))
                return new List<ResultadoPesquisa>();

            hrpEntities hrp = new hrpEntities();
            int textInt = 0;
            Int32.TryParse(text, out textInt);
            textInt = textInt == 0 ? Int32.MaxValue : textInt;
            var funcionarios = from f in hrp.hrp_funcionario
                               join cargo in hrp.hrp_cargos on f.id_cargo equals cargo.id into funcCargoView
                               from funcCargo in funcCargoView
                               where f.activo.Value && f.id_empresa == id_empresa &&
                               (f.nome.Contains(text) || f.email == text || f.telefone == text
                               || f.telemovel == text || f.ss == textInt || f.nif == textInt)                                
                               select new ResultadoPesquisa
                               {
                                   ContentTypeLabel = "Funcionário",
                                   CreationDate = f.user_timestamp,
                                   Summary = f.obs,
                                   Thumbnail = f.foto,
                                   Title = f.nome + " [" + funcCargo.cargo + "]",
                                   Url = "../Funcionarios/Ficha.aspx?id=" + f.id,
                                   Label = "label-success",
                                   FullUrl = leftPartUrl + "/Funcionarios/Ficha.aspx?id=" + f.id,
                                   ContentType = TipoResultado.Funcionario
                               };

            var cargos = from c in hrp.hrp_cargos
                         where c.activo.Value && c.id_empresa.Value == id_empresa
                         && c.cargo.Contains(text)
                         select new ResultadoPesquisa
                         {
                             ContentTypeLabel = "Cargo",
                             CreationDate = c.data_criacao,
                             Summary = c.observacao,
                             Thumbnail = string.Empty,
                             Title = c.cargo,
                             Url = "../Cargos/Editar.aspx?id=" + c.id,
                             Label = "label-info",
                             FullUrl = leftPartUrl + "/Cargos/Editar.aspx?id=" + c.id,
                             ContentType = TipoResultado.Cargo
                         };

            var departamentos = from d in hrp.hrp_departamentos
                                where d.activo && d.id_empresa == id_empresa
                                && d.departamento.Contains(text)
                                select new ResultadoPesquisa
                                {
                                    ContentTypeLabel = "Departamento",
                                    CreationDate = d.data_criacao,
                                    Summary = d.observacao,
                                    Thumbnail = string.Empty,
                                    Title = d.departamento,
                                    Url = "../Departamentos/Editar.aspx?id=" + d.id,
                                    Label = "label-primary",
                                    FullUrl = leftPartUrl + "/Departamentos/Editar.aspx?id=" + d.id,
                                    ContentType = TipoResultado.Departamento
                                };

            var eventos = from e in hrp.hrp_eventos_detalhe
                          join f in hrp.hrp_funcionario on e.id_funcionario equals f.id into funcView
                          from func in funcView
                          where e.estado && e.id_empresa == id_empresa
                          && (e.observacao.Contains(text)
                              || e.titulo.Contains(text)
                              || e.evento.Contains(text)
                              || func.nome.Contains(text))
                          select new ResultadoPesquisa
                          {
                              ContentTypeLabel = "Evento",
                              CreationDate = e.user_timestamp,
                              Summary = "["+func.nome + " - " + e.evento +"] "+ e.data_inicio + " a " + e.data_fim + "\r\n" +e.observacao,
                              Thumbnail = string.Empty,
                              Title = e.titulo, 
                              Url = "/private/agenda/ler.aspx?id=" + e.id,
                              Label = "label-warning",
                              FullUrl = leftPartUrl + "/private/agenda/ler.aspx?id=" + e.id,
                              ContentType = TipoResultado.Evento
                          };

            var mails = from m in hrp.hrp_mensagens
                        where (m.user_enviaid==utilizadorId || m.user_recebeid==utilizadorId) &&
                        (m.nome_envia.Contains(text) || m.nome_recebe.Contains(text)
                        || m.assunto.Contains(text) || m.mensagem.Contains(text))                        
                        select new ResultadoPesquisa
                        {
                            ContentTypeLabel = "Mensagem",
                            CreationDate = m.data_create,
                            Summary = m.mensagem,
                            Thumbnail = string.Empty,
                            Title = m.assunto,
                            Url = "/private/Mensagens/ler.aspx?id=" + m.id,
                            Label = "label-brown",
                            FullUrl = leftPartUrl + "/private/Mensagens/ler.aspx?id=" + m.id,
                            ContentType = TipoResultado.Mensagem
                        };

            var vencimentos = from v in hrp.hrp_facturacao_funcionario_detalhe
                              join f in hrp.hrp_facturacao_geral on v.id_facturacao_geral equals f.id
                              join func in hrp.hrp_funcionario on v.id_funcionario equals func.id
                              where v.id_empresa == id_empresa && f.estado!=2 &&
                              ((func.email == text || func.nome.Contains(text)) ||
                              (v.ano_referente==text || v.mes_referente==text))
                              select new ResultadoPesquisa
                              {
                                  ContentTypeLabel = "Vencimento",
                                  CreationDate = f.user_timestamp,
                                  Summary = func.nome,
                                  Thumbnail = func.foto,
                                  Title = v.mes_referente + "/" + v.ano_referente,
                                  Url = "/Private/Vencimentos/Recibo.aspx?id="+func.id+"&vencId=" + f.id,
                                  Label = "label-danger",
                                  FullUrl = leftPartUrl + "/Private/Vencimentos/Recibo.aspx?id=" + func.id +"&vencId=" + f.id,
                                  ContentType = TipoResultado.Vencimento
                              };
                        

            return funcionarios.Union(cargos).Union(departamentos).Union(eventos).Union(mails).Union(vencimentos)
                .OrderBy(x=>x.ContentType).ThenByDescending(x=>x.CreationDate).ThenBy(x=>x.Title).ToList();

        }
    }
}
